package EvaTCPL;
import java_cup.runtime.*;
import java.lang.*;
import java.util.StringTokenizer;
import java.util.NoSuchElementException;


%%
%{
  private int comment_count = 0;
%}
%line
%char
%eofval{
  return new Yytoken(sym.EOF,yyline,yychar,"","EOF");
%eofval}

%state COMMENT

ALPHA=[A-Za-z]
DIGIT=[0-9]
NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\x0a\x0d\r\f]
WHITE_SPACE_CHAR=[\n\ \t\b\x0a\x0d\r\f]
STRING_TEXT=(\\\"|[^\n\"]|\\{WHITE_SPACE_CHAR}+\\)*
COMMENT_TEXT=(.)
%cup

%%
<YYINITIAL, COMMENT> {NONNEWLINE_WHITE_SPACE_CHAR}+ { }
<YYINITIAL, COMMENT> \n|\013 {}

<YYINITIAL> "("   { return (new Yytoken(sym.tLEFTPARENS,yyline, yychar,null,yytext())); }
<YYINITIAL> ")"   { return (new Yytoken(sym.tRIGHTPARENS,yyline, yychar,null,yytext())); }
<YYINITIAL> "{"   { return (new Yytoken(sym.tLEFTBRACE,yyline, yychar,null,yytext())); }
<YYINITIAL> "}"   { return (new Yytoken(sym.tRIGHTBRACE,yyline, yychar,null,yytext())); }
<YYINITIAL> "["   { return (new Yytoken(sym.tLEFTBRACKET,yyline, yychar,null,yytext())); }
<YYINITIAL> "]"   { return (new Yytoken(sym.tRIGHTBRACKET,yyline, yychar,null,yytext())); }
<YYINITIAL> ","   { return (new Yytoken(sym.tCOMMA,yyline, yychar,null,yytext())); }
<YYINITIAL> ":"   { return (new Yytoken(sym.tCOLON,yyline, yychar,null,yytext())); }
<YYINITIAL> ";"   { return (new Yytoken(sym.tSEMICOLON,yyline, yychar,null,yytext())); }

<YYINITIAL> "=="  { return (new Yytoken(sym.tEQUAL,yyline, yychar,null,yytext())); }
<YYINITIAL> "="   { return (new Yytoken(sym.tASSIGN,yyline, yychar,null,yytext())); }
<YYINITIAL> "+"   { return (new Yytoken(sym.tPLUS,yyline, yychar,null,yytext())); }
<YYINITIAL> "-"   { return (new Yytoken(sym.tMINUS,yyline, yychar,null,yytext())); }
<YYINITIAL> "/"   { return (new Yytoken(sym.tDIV,yyline, yychar,null,yytext())); }
<YYINITIAL> "*"   { return (new Yytoken(sym.tMUL,yyline, yychar,null,yytext())); }
<YYINITIAL> "%"   { return (new Yytoken(sym.tMOD,yyline, yychar,null,yytext())); }
<YYINITIAL> "!="  { return (new Yytoken(sym.tNOTEQUAL,yyline, yychar,null,yytext())); }
<YYINITIAL> "<"   { return (new Yytoken(sym.tLESS,yyline, yychar,null,yytext())); }
<YYINITIAL> "<="  { return (new Yytoken(sym.tLESSEQUAL,yyline, yychar,null,yytext())); }
<YYINITIAL> ">"   { return (new Yytoken(sym.tGREATER,yyline, yychar,null,yytext())); }
<YYINITIAL> ">="  { return (new Yytoken(sym.tGREATEREQUAL,yyline, yychar,null,yytext())); }
<YYINITIAL> "&&"  { return (new Yytoken(sym.tAND,yyline, yychar,null,yytext())); }
<YYINITIAL> "||"  { return (new Yytoken(sym.tOR,yyline, yychar,null,yytext())); }
<YYINITIAL> "!"   { return (new Yytoken(sym.tNOT,yyline, yychar,null,yytext())); }

<YYINITIAL> "controlsteps"   { return (new Yytoken(sym.tCONTROLSTEPS,yyline, yychar,null,yytext())); }
<YYINITIAL> "evalsteps"      { return (new Yytoken(sym.tEVALSTEPS,yyline, yychar,null,yytext())); }
<YYINITIAL> "verbose"        { return (new Yytoken(sym.tVERBOSE,yyline, yychar,null,yytext())); }
<YYINITIAL> "evar"           { return (new Yytoken(sym.tEVAR,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "svar"           { return (new Yytoken(sym.tSVAR,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "cvar"           { return (new Yytoken(sym.tCVAR,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "pvar"           { return (new Yytoken(sym.tPVAR,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "performance"    { return (new Yytoken(sym.tPERFORMANCE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "int"            { return (new Yytoken(sym.tINT,yyline, yychar,null,yytext())); }
<YYINITIAL> "real"           { return (new Yytoken(sym.tREAL,yyline, yychar,null,yytext())); }
<YYINITIAL> "class"          { return (new Yytoken(sym.tCLASS,yyline, yychar,null,yytext())); }
<YYINITIAL> "function"       { return (new Yytoken(sym.tFUNCTION,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "func"           { return (new Yytoken(sym.tFUNCTION,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "calculate"      { return (new Yytoken(sym.tCALCULATE,yyline, yychar,null,yytext())); }
<YYINITIAL> "calc"           { return (new Yytoken(sym.tCALCULATE,yyline, yychar,null,yytext())); }
<YYINITIAL> "domain"         { return (new Yytoken(sym.tDOMAIN,yyline, yychar, new Integer(yyline),yytext())); }
<YYINITIAL> "stochasticty"   { return (new Yytoken(sym.tSTOCH,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "drift"          { return (new Yytoken(sym.tDRIFT,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "periodcity"     { return (new Yytoken(sym.tPERIOD,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "dependcency"    { return (new Yytoken(sym.tDEPEND,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "delay"          { return (new Yytoken(sym.tDELAY,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "istore"          { return (new Yytoken(sym.tISTORE,yyline, yychar, new Integer(yyline),yytext())); }
<YYINITIAL> "intstore"          { return (new Yytoken(sym.tISTORE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "estore"          { return (new Yytoken(sym.tESTORE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "extstore"          { return (new Yytoken(sym.tESTORE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "init"           { return (new Yytoken(sym.tINIT,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "measurenoise"   { return (new Yytoken(sym.tMEASURENOISE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "stoch"          { return (new Yytoken(sym.tSTOCH,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "depend"         { return (new Yytoken(sym.tDEPEND,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "mnoise"         { return (new Yytoken(sym.tMEASURENOISE,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "period"         { return (new Yytoken(sym.tPERIOD,yyline, yychar,new Integer(yyline),yytext())); }
<YYINITIAL> "dtime"           { return (new Yytoken(sym.tDTIME,yyline, yychar,null,yytext())); }
<YYINITIAL> "drifttime"           { return (new Yytoken(sym.tDTIME,yyline, yychar,null,yytext())); }
<YYINITIAL> "sinamp"         { return (new Yytoken(sym.tSINAMP,yyline, yychar,null,yytext())); }
<YYINITIAL> "sinper"         { return (new Yytoken(sym.tSINPER,yyline, yychar,null,yytext())); }
<YYINITIAL> "cosamp"         { return (new Yytoken(sym.tCOSAMP,yyline, yychar,null,yytext())); }
<YYINITIAL> "cosper"         { return (new Yytoken(sym.tCOSPER,yyline, yychar,null,yytext())); }
<YYINITIAL> "time0"          { return (new Yytoken(sym.tTIMEZERO,yyline, yychar,null,yytext())); }
<YYINITIAL> "timezero"       { return (new Yytoken(sym.tTIMEZERO,yyline, yychar,null,yytext())); }
<YYINITIAL> "timeadv"        { return (new Yytoken(sym.tTIMEADVANCE,yyline, yychar,null,yytext())); }
<YYINITIAL> "length"         { return (new Yytoken(sym.tLENGTH,yyline, yychar,null,yytext())); }
<YYINITIAL> "len"            { return (new Yytoken(sym.tLENGTH,yyline, yychar,null,yytext())); }

<YYINITIAL> "PI"             { return (new Yytoken(sym.tPI,yyline, yychar,null,yytext())); }
<YYINITIAL> "pi"             { return (new Yytoken(sym.tPI,yyline, yychar,null,yytext())); }
<YYINITIAL> "E"              { return (new Yytoken(sym.tE,yyline, yychar,null,yytext())); }
<YYINITIAL> "e"              { return (new Yytoken(sym.tE,yyline, yychar,null,yytext())); }
<YYINITIAL> "time"           { return (new Yytoken(sym.tTIME,yyline, yychar,null,yytext())); }
<YYINITIAL> "this"           { return (new Yytoken(sym.tTHIS,yyline, yychar,null,yytext())); }
<YYINITIAL> "sin"            { return (new Yytoken(sym.tSIN,yyline, yychar,null,yytext())); }
<YYINITIAL> "cos"            { return (new Yytoken(sym.tCOS,yyline, yychar,null,yytext())); }
<YYINITIAL> "tan"            { return (new Yytoken(sym.tTAN,yyline, yychar,null,yytext())); }
<YYINITIAL> "asin"           { return (new Yytoken(sym.tASIN,yyline, yychar,null,yytext())); }
<YYINITIAL> "acos"           { return (new Yytoken(sym.tACOS,yyline, yychar,null,yytext())); }
<YYINITIAL> "atan"           { return (new Yytoken(sym.tATAN,yyline, yychar,null,yytext())); }
<YYINITIAL> "abs"            { return (new Yytoken(sym.tABS,yyline, yychar,null,yytext())); }
<YYINITIAL> "ceil"           { return (new Yytoken(sym.tCEIL,yyline, yychar,null,yytext())); }
<YYINITIAL> "floor"          { return (new Yytoken(sym.tFLOOR,yyline, yychar,null,yytext())); }
<YYINITIAL> "max"            { return (new Yytoken(sym.tMAX,yyline, yychar,null,yytext())); }
<YYINITIAL> "min"            { return (new Yytoken(sym.tMIN,yyline, yychar,null,yytext())); }
<YYINITIAL> "sgn"            { return (new Yytoken(sym.tSGN,yyline, yychar,null,yytext())); }
<YYINITIAL> "ln"             { return (new Yytoken(sym.tLN,yyline, yychar,null,yytext())); }
<YYINITIAL> "log"            { return (new Yytoken(sym.tLOG,yyline, yychar,null,yytext())); }
<YYINITIAL> "pow"            { return (new Yytoken(sym.tPOW,yyline, yychar,null,yytext())); }
<YYINITIAL> "exp"            { return (new Yytoken(sym.tEXP,yyline, yychar,null,yytext())); }
<YYINITIAL> "sqrt"           { return (new Yytoken(sym.tSQRT,yyline, yychar,null,yytext())); }
<YYINITIAL> "ndist"          { return (new Yytoken(sym.tNDIST,yyline, yychar,null,yytext())); }
<YYINITIAL> "udist"          { return (new Yytoken(sym.tUDIST,yyline, yychar,null,yytext())); }
<YYINITIAL> "gdist"          { return (new Yytoken(sym.tGDIST,yyline, yychar,null,yytext())); }
<YYINITIAL> "edist"          { return (new Yytoken(sym.tEDIST,yyline, yychar,null,yytext())); }
<YYINITIAL> "rndint"         { return (new Yytoken(sym.tRNDINT,yyline, yychar,null,yytext())); }
<YYINITIAL> "rndbool"        { return (new Yytoken(sym.tRNDBOOL,yyline, yychar,null,yytext())); }
<YYINITIAL> "rndclass"       { return (new Yytoken(sym.tRNDCLASS,yyline, yychar,null,yytext())); }
<YYINITIAL> "if"             { return (new Yytoken(sym.tIF,yyline, yychar,null,yytext())); }
<YYINITIAL> "then"           { return (new Yytoken(sym.tTHEN,yyline, yychar,null,yytext())); }
<YYINITIAL> "elseif"         { return (new Yytoken(sym.tELSEIF,yyline, yychar,null,yytext())); }
<YYINITIAL> "else"           { return (new Yytoken(sym.tELSE,yyline, yychar,null,yytext())); }
<YYINITIAL> "true"           { return (new Yytoken(sym.tTRUE,yyline, yychar,null,yytext())); }
<YYINITIAL> "false"          { return (new Yytoken(sym.tFALSE,yyline, yychar,null,yytext())); }

<YYINITIAL> {ALPHA}({ALPHA}|{DIGIT}|"_")* { String str = yytext();
         return (new Yytoken(sym.tIDENTIFIER,yyline, yychar,str,yytext()));
         }

<YYINITIAL> {DIGIT}+"."{DIGIT}+ { return (new Yytoken(sym.tREALVALUE,yyline, yychar,(new Double(yytext())),yytext())); }

<YYINITIAL> {DIGIT}+"E"{DIGIT}+ { return (new Yytoken(sym.tREALVALUE,yyline, yychar,(new Double(yytext())),yytext())); }
<YYINITIAL> {DIGIT}+"."{DIGIT}+"E"{DIGIT}+ { return (new Yytoken(sym.tREALVALUE,yyline, yychar,(new Double(yytext())),yytext())); }

<YYINITIAL> {DIGIT}+ { return (new Yytoken(sym.tINTVALUE,yyline, yychar,(new Integer(yytext())),yytext())); }


<YYINITIAL, COMMENT> "/*" { yybegin(COMMENT); comment_count = comment_count + 1; }
<COMMENT> "*/" { 
	comment_count = comment_count - 1; 
	if (comment_count == 0) {
    		yybegin(YYINITIAL);
	}
}
<COMMENT> {COMMENT_TEXT} { }

<YYINITIAL> "//"(.)* { }

<YYINITIAL,COMMENT> (.) { System.out.println("Illegal character: <" + yytext() + "> at line "+yyline); }


